var removeElement = function (nums, val) {
  let count = 0;
  let len = nums.length;
  let arr = [];
  for (let i = 0; i < len; i++) {
    if (nums[i] === val) {
      arr.push(i);
    }
    if (nums[i] !== val) {
      count++;
    }
  }
  for (let i = arr.length - 1; i >= 0; i--) {
    nums.splice(arr[i], 1);
  }
  return count;
};

// 使用 splice 方法，时间复杂度是O(n^2)
var removeElement = function (nums, val) {
  let k = 0;
  let len = nums.length;
  for (let i = len - 1; i >= 0; i--) {
    if (nums[i] === val) {
      nums.splice(i, 1);
    } else {
      k++;
    }
  }
  return k;
};

// 尝试使用双指针的方式
var removeElement = function (nums, val) {
  // 慢指针指向当前需要填充的位置
  let slow = 0;

  // 快指针遍历整个数组
  for (let fast = 0; fast < nums.length; fast++) {
    // 当快指针指向的元素不等于val时
    if (nums[fast] !== val) {
      // 将快指针位置的元素放到慢指针位置
      nums[slow] = nums[fast];
      // 慢指针后移一位
      slow++;
    }
  }

  // 返回剩余元素的数量
  return slow;
};